/*
 * To change this template, choose Utils | Templates
 * and open the template in the editor.
 */
package avenue;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import javax.swing.Icon;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import model.AppUser;
import model.Customer;
import model.DBManager;
import model.Module;
import model.Vehicle;

/**
 *
 * @author apostolis ΕΔΩ ΘΑ ΒΑΛΟΥΜΕ ΓΕΝΙΚΕΣ CLASSES
 */
public class Utils {

    public static Avenue mainForm;
    public static String appName = "TELE-PASS";
    public static String appVersion = "ver 1.5";
    private static String dbURL = "jdbc:derby://localhost:1527/avenue;user=avenue;password=123";
    private static Connection conn;
    public static String msgDialogTitle = "ΠΡΟΣΟΧΗ";
    public static String msgSystemProtected = "Εγγραφή προτατευόμενη από το σύστημα!";
    public static String msgCantDeleteOnlineUser = "Δεν μπορείτε να διαγράψετε χρήστη που είναι online!";
    public static String msgUserExists = "Ο χρήστης %s υπάρχει. Παρακαλώ διορθώστε.";
    public static String msgVehicleExists = "Το όχημα %s υπάρχει. Παρακαλώ διορθώστε.";
    public static String msgVehicleCantBeDeleted = "Το όχημα %s δεν μπορεί να διαγραφεί, λόγω διελεύσεων ή πληρωμών.";
    public static String msgProgramCantBeDeleted = "Το πρόγραμμα %s δεν μπορεί να διαγραφεί, λόγω συμμετοχής οχημάτων.";
    public static String msgCustomerCantBeDeleted = "Ο πελάτης %s %s δεν μπορεί να διαγραφεί, λόγω ύπαρξης διελεύσεων ή πληρωμών.";
    public static String msgNoMoreRolePermissions = "Δεν υπάρχουν άλλα δικαιώματα.";
    public static String msgPassDenied = "Μη αποδεκτά στοιχεία. Δεν επιτρέπεται η διέλευση.";
    public static String msgRoleCantBeDeleted = "Ο ρόλος %s δεν μπορεί να διαγραφεί.";
    public static String msgLowBalance = "Χαμηλό υπόλοιπο";
    public static String msgCardIsInactive = "Η κάρτα είναι απενεργοποιημένη";
    public static String msgLowAmmount = "Ελάχιστο ποσό πληρωμής 10 ευρώ.";
    public static String msgYouHaveNoPermission = "Δεν έχετε δικαίωμα %s.";
    public static String msgNumericFieldRequired = "Η τιμή '%s' δεν είναι αριθμός";
    public static String msgNotDataForCriteria = "Δεν βρέθηκαν δεδομένα που να πληρούν τα κριτήρια που δώσατε.";
    public static String msgPaymentWay = "Οι πληρωμές γίνονται μέσω της Π.Χ. 'Διέλευση Οχήματος'.";
    public static String msgAfmExists = "Το ΑΦΜ %s υπάρχει. Παρακαλώ διορθώστε.";

    public static String appTitle() {
        return appName + " " + appVersion;
    }

    public static void createConnection() {
        try {
            Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
            //Get a connection
            conn = DriverManager.getConnection(dbURL);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException except) {
            System.out.println("ERROR: " + except.getMessage());
        }
    }

    public static void shutdown() {
        try {
            if (conn != null) {
                DriverManager.getConnection(dbURL + ";shutdown=true");
                conn.close();
            }
        } catch (SQLException sqlExcept) {
        }
    }

    public static void centerOnScreen(JFrame f) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();

        //Calculate the frame location  
        int x = (screenSize.width - f.getWidth()) / 2;
        int y = (screenSize.height - f.getHeight()) / 2;

        //Set the new frame location  
        f.setLocation(x, y);
    }

    public static void centerOnScreen(JDialog f) {
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Dimension screenSize = toolkit.getScreenSize();

        //Calculate the frame location  
        int x = (screenSize.width - f.getWidth()) / 2;
        int y = (screenSize.height - f.getHeight()) / 2;

        //Set the new frame location  
        f.setLocation(x, y);
    }

    //Get the screen size  
    public static void centerOnParent(JDialog f) {
        int x;
        int y;

        // Find out our parent 
        Container myParent = f.getParent();
        Point topLeft = myParent.getLocationOnScreen();
        Dimension parentSize = myParent.getSize();

        Dimension mySize = f.getSize();

        if (parentSize.width > mySize.width) {
            x = ((parentSize.width - mySize.width) / 2) + topLeft.x;
        } else {
            x = topLeft.x;
        }

        if (parentSize.height > mySize.height) {
            y = ((parentSize.height - mySize.height) / 2) + topLeft.y;
        } else {
            y = topLeft.y;
        }

        f.setLocation(x, y);
        f.setVisible(true);
        f.requestFocus();
    }

    public static boolean acceptNumbersOnly(String s) {
        try {
            if (!s.trim().equals("")) {
                Integer.parseInt(s);
            }

            return true;
        } catch (Exception ex) {
            Utils.mainForm.log("acceptNumbersOnly(" + s + "), " + ex.getMessage());
            showMessage(null, String.format(Utils.msgNumericFieldRequired, s), msgDialogTitle, JOptionPane.WARNING_MESSAGE);
            return false;
        }
    }

    public static AppUser appUserByUserName(String userName) {
        try {
            return DBManager.em.createNamedQuery("AppUser.findByUserName",
                    AppUser.class).setParameter("userName", userName).getSingleResult();
        } catch (Exception ex) {
            Utils.mainForm.log("appUserByUserName(" + userName + "), " + ex.getMessage());
            return null;
        }
    }

    public static Customer customerByafm(String afm) {
        try {
            return DBManager.em.createNamedQuery("Customer.findByAfm",
                    Customer.class).setParameter("afm", Integer.parseInt(afm)).getSingleResult();
        } catch (Exception ex) {
            Utils.mainForm.log("customerByafm(" + afm + "), " + ex.getMessage());
            return null;
        }
    }

    public static Vehicle VehicleByRegNumber(String regNumber) {
        try {
            return DBManager.em.createNamedQuery("Vehicle.findByRegNumber",
                    Vehicle.class).setParameter("regNumber", regNumber).getSingleResult();
        } catch (Exception ex) {
            Utils.mainForm.log("VehicleByRegNumber(" + regNumber + "), " + ex.getMessage());
            return null;
        }
    }

    public static Module moduleByDescription(String description) {
        try {
            return DBManager.em.createNamedQuery("Module.findByDescription",
                    Module.class).setParameter("description", description).getSingleResult();
        } catch (Exception ex) {
            Utils.mainForm.log("moduleByDescription(" + description + "), " + ex.getMessage());
            return null;
        }
    }

    public static boolean intToBool(int i) {
        return (i == 1);
    }

    public static int boolToInt(boolean b) {
        return (b == true ? 1 : 0);
    }

    public static Date beginOfThisMonth(Date d) {
        Calendar c = Calendar.getInstance();
        c.set(c.get(Calendar.YEAR), Calendar.MONTH, 1, 0, 0, 0);
        return c.getTime();
    }

    public static void initTableState(JTable t) {
        t.setColumnSelectionAllowed(false);
        t.setRowSelectionAllowed(true);
    }

    public static void logUCstart(JFrame f) {
        mainForm.log(f.getTitle() +": Εναρξη");
    }

    public static void logUCstart(JDialog f) {
        mainForm.log(f.getTitle() +": Εναρξη");
    }

    public static void logUCend(JFrame f, boolean exitAndSave) {
        if (exitAndSave) {
            mainForm.log(f.getTitle() + "': Αποθήκευση");
        } else {
            mainForm.log(f.getTitle() + "': Aκύρωση");
        }
    }

    public static void logUCend(JDialog f, boolean exitAndSave) {
        if (exitAndSave) {
            mainForm.log(f.getTitle() + "': Αποθήκευση");
        } else {
            mainForm.log(f.getTitle() + "': Aκύρωση");
        }
    }

    public static void showMessage(Component cmpt, Object o, String string, int i) {
        mainForm.log("   Μήνυμα: " + o);
        JOptionPane.showMessageDialog(cmpt, o, string, i);
    }
    
    
}
